package cn.tedu.sp06z.filter;

import cn.tedu.sp01.web.util.JsonResult;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * 访问过滤器
 */
@Slf4j
@Component
public class AccessFilter extends ZuulFilter {

    @Override
    //1.过滤器的类型：pre、routing、post、error
    public String filterType() {
        return FilterConstants.PRE_TYPE; //设置为前置过滤器
    }

    @Override
    //2.过滤器的顺序
    public int filterOrder() {
        //zuul有5个默认的过滤器，在前5个过滤器中，serviceId是不存在的，只有等第5个过滤器执行完，servicId才存在。
        return 6; //加到前置过滤器的第6个顺序执行
    }

    @Override
    //3.针对当前请求，判断是否要执行过滤代码
    public boolean shouldFilter() {
        //需要：请求商品服务需要检查权限，请求用户和订单服务不检查权限。

        //判断当前调用的服务，是否为item-service,获取调用的服务id
        RequestContext ctx = RequestContext.getCurrentContext(); //请求上下文对象
        String serviceId = (String) ctx.get(FilterConstants.SERVICE_ID_KEY);

        //如果id是item-service，返回true
        return "item-service".equals(serviceId);
    }

    @Override
    public Object run() throws ZuulException { //4.过滤代码
        //http://localhost:3001/item-service/3ece?token=dededcdc

        //接收token参数
        RequestContext rc = RequestContext.getCurrentContext();
        HttpServletRequest request = rc.getRequest();
        String token = request.getParameter("token");

        //如果token为空，则停止继续调用，给出异常响应
        if (StringUtils.isBlank(token)) {
            //阻止继续调用
            rc.setSendZuulResponse(false);
            //返回响应
            String json = JsonResult.err()
                    .code(JsonResult.NOT_LOGIN)
                    .msg("Not Login!未登录!")
                    .toString();

            rc.addZuulResponseHeader("Context-Type", "application/json;charset=UTF-8");//设置协议头
            rc.setResponseBody(json);//设置协议体
        }
        return null; //zuul当前版本中不起任何作用
    }
}
